<?php
// 封装数据操作函数

//通过判断是否有 常量   可以控制访问   只有config.php 中定了 这个常量才可以访问
defined('INC') or die('404');


//数据库的公共操作
$db_host = isset($db_host) ? $db_host : '127.0.0.1'; // localhost
$db_user = isset($$db_user) ? $$db_user : 'root'; 
$db_pwd  = isset($db_pwd) ? $db_pwd : '';
$db_name = isset($db_name) ? $db_name : 'test521';

$db_debug= isset($db_debug) ? $db_debug : true ;     //是否 调试模式  true  false 
$db_debug_log = false ; // false 关闭 true 开 在网站跟目录/log/sql_err_log.html



#1.链接数据库服务器
$db = @mysql_connect($db_host ,$db_user ,$db_pwd) or die( 'Could not connect: ' . mysql_error() );
#2.选择数据库
mysql_select_db( $db_name, $db ) or die( 'Could not select_db: '. $db_name . '--' . mysql_error() ) ; //选择数据库
#3.设置字符编码
mysql_query('set names utf8' , $db  ); //设置字符编码 为utf-8



/**
	执行sql语句 mysql_query
*/
function dbQuery( $sql ){
	global $db ;
	global $db_debug;
	global $db_debug_log;
	

	//echo $sql;

	
	$err = '';
	$rs = mysql_query( $sql , $db );
	if(!$rs){
		$err .= '---------------'.date('Y-m-d H:i:s').'--------------------<br/>'.PHP_EOL;
		$err .= '#'.mysql_errno().' - '.mysql_error() . '<br/>'.PHP_EOL;
		$err .= $sql. '<br/>' .PHP_EOL;
		//直接输出错误
		
		if( $db_debug == true ){
		
			echo $err;
		}
		//把错误保存到文件
		if( $db_debug_log == true ){
			
			$file = $_SERVER['DOCUMENT_ROOT'].'/log/sql_err_log_'.date('Y_m').'.html';
			$dir = dirname($file);//获取路径的目录
			if( !is_dir( $dir )){
				$res=mkdir( $dir ,0777,true); 
			}
			
			file_put_contents($file  ,  $err , FILE_APPEND );// 文件地址  数据  【FILE_APPEND】追加
		}
		
	
	}
	
	
	return $rs;
}


/**
	读取1条记录 Row  返回 一维数组
		返回 array(....)  读到数据了
		返回 array()      sql没有错误  数据是
		返回 false        sql语句错了
*/
function dbRow( $sql ){
	
	//执行sql语句
	$rs = dbQuery( $sql ); // rs记录集  false
	if(!$rs){
		return false;
	}
	/*
	if( !$row = mysql_fetch_array( $rs ,MYSQL_ASSOC) ){
		$row = array();
	}
	return $row;
	*/
	$row = mysql_fetch_array( $rs ,MYSQL_ASSOC); //array  false
	if($row){
		return $row;
	}else{
		return array();
	}

}
/**
	读取多条记录 List \
		返回 二维数组
		返回 空数组
		返回 false
*/
function dbList( $sql ){
	
	//执行sql语句
	$rs = dbQuery( $sql ); // rs  false
	if(!$rs){
		return false;
	}
	
	$list = array();
	while (  $row =  mysql_fetch_array( $rs ,MYSQL_ASSOC)  ) {
			$list[] = $row ;
	}
	return $list;
	
}



/**
	添加 insert
	参数1 表名
	参数2 数据数组
	
	返回 insert_id  int  主键  A_I   0 | 1+
	返回 false  

*/
function dbInsert( $table , $arr  ){
	

	global $db;
	// 拼接sql语句
	if( !is_array($arr) ){ return false;}
	if( empty($table) ){ return false;}
	
	$k_arr = array();
	$v_arr = array();
	foreach($arr as $k => $v){
		$k_arr[] = $k;
		$v_arr[] = $v;
		
	}

	
	$k_str =  implode('` ,`',$k_arr);
	$k_str = '`'.$k_str.'`';
	
	$v_str =  implode('\',\'',$v_arr);
	$v_str = '\''. $v_str  . '\'';

	$sql = "
	insert into `{$table}`
	({$k_str})
	values
	({$v_str});
	";

	$rs = dbQuery( $sql );
	if(!$rs){
		return false;
	}

	return mysql_insert_id( $db  ); // true  false;
	
}
/**
	修改 update
	参数1 表名
	参数2 数据数组
	参数3 条件字符串
	
	返回 true
	返回 false  

*/
function dbUpdate( $table , $arr , $where ){
	// 拼接sql语句
	if( !is_array($arr) ){ return false;}
	if( empty($table) ){ return false;}
	
	$a = array();
	foreach($arr as $k => $v ){
		$a[] = 	"`{$k}` = '{$v}'" ;
	}
	
	$a = implode(',',$a);
	
	
	$sql = "
UPDATE `{$table}` 
SET 
	{$a}
WHERE {$where} ;
";	

	return dbQuery( $sql ); // true  false;
	
}


/**
	修改 dbDelete
	参数1 表名
	参数2 条件字符串
	
	返回 true
	返回 false  

*/
function dbDelete( $table , $where ){
	
	$sql = "delete from `{$table}` 	where {$where} ;";
	return dbQuery( $sql ); // true  false;

}


//返回 新插入的 id 
function dbInsert_id(){
	global $db;
	return mysql_insert_id( $db  ); // 函数返回上一步 INSERT 操作产生的 ID。;
}

//返回 受影响的记录数 insert delete update
function dbAffected_rows(){
	global $db;
	return 	$affected_rows = mysql_affected_rows( $db  );
}








/*
过滤sql注入
1.如果 数字 或者 数字字符串  -》 int
2.字符串    过滤 sql注入 字符
3.数组 遍历  过滤字符串 或 数字
*/
function sec(&$array )
{
    //如果是数组，遍历数组，递归调用
    if (is_array($array)) {
        foreach ($array as $k => $v) {
            $array[$k] = sec($v);
        }
    } else {
		if (is_numeric($array)) {
                $array = intval($array);
        }else if (is_string($array)) {
		
            //函数转义 SQL 语句中使用的字符串中的特殊字符。
            $array = mysql_real_escape_string($array);//重点了解这个函数  了解什么是 sql注入
			
        } else {
            
        }
    }

    return $array;
}















